﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaLogica.CL.Usuario;
using CapaLogica.CL.UtilidadesGenerales;

using CapaLogica.CL.ComentarioEntrada;

namespace CapaLogica.CL.Entrada
{
    public class GestorEntrada
    {

        public static int crearEntrada(String pTitulo, String pComentario, int pidBlog)
        {
            try
            {
                int idUsuario = Session.Id;
                Cl_Entrada entrada = new Cl_Entrada(pTitulo, pComentario);
                EntradaPersistente persistenteEntrada = new EntradaPersistente();

              return  persistenteEntrada.insertarEntrada(entrada, pidBlog);

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        public static Dictionary<String, Object> consultarEntrada(int pIdEntrada)
        {
            try
            {
                Dictionary<String, Object> entrada = new Dictionary<string, Object>();
                EntradaPersistente persistenteEntrada = new EntradaPersistente();
                EsEntrada  temp = persistenteEntrada.buscarEntradaPorId(pIdEntrada);
                
                       
                    entrada = new Dictionary<String, Object>();
                    entrada.Add("id", temp.IdEntrada);
                    entrada.Add("titulo", temp.Titulo);
                    entrada.Add("comentario", temp.Comentario);
                    entrada.Add("fecha", temp.Fecha);
                    entrada.Add("modificado", temp.Modificado);
                    entrada.Add("fechaModificado", temp.FechaModificado);
                    entrada.Add("idUsuario", temp.IdUsuario);
                    entrada.Add("nombreUsuario", temp.NombreUsuario);
                    entrada.Add("comentarios", GestorComentarioEntrada.listarComentariosEntrada(pIdEntrada));
                    return entrada;
                          
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        

         
        public static List<Dictionary<String, Object>> listarEntradasBlog(int pidBlog)
        {
            try
            {
                EntradaPersistente persistenteEntrada = new EntradaPersistente();

                List<EsEntrada> listaEntradas = persistenteEntrada.listarEntradasBlog(pidBlog);
                List<Dictionary<String, Object>> datosEntradas = new List<Dictionary<string, Object>>();
                Dictionary<String, Object> entrada = null;

                foreach (EsEntrada temp in listaEntradas)
                {
                    entrada = new Dictionary<String, Object>();
                    entrada.Add("id", temp.IdEntrada);
                    entrada.Add("titulo", temp.Titulo);
                    entrada.Add("comentario", temp.Comentario);
                    entrada.Add("fecha", temp.Fecha);
                    entrada.Add("modificado", temp.Modificado);
                    entrada.Add("fechaModificado", temp.FechaModificado);
                    entrada.Add("idUsuario", temp.IdUsuario);
                    entrada.Add("nombreUsuario", temp.NombreUsuario);
                    entrada.Add("nota", temp.Nota);

                    datosEntradas.Add(entrada);
                }

                return datosEntradas;
            }
            catch (Exception)
            {
                throw;
            }

        }



        public static List<Dictionary<String, Object>> listarComentariosEntrada(int pidEntrada)
        {
            try
            {

                List<EsComentarioEntrada> comentarios = new ComentarioEntradaPersistente().listarComentariosEntrada(pidEntrada);
                List<Dictionary<String, Object>> datosComentarios = new List<Dictionary<string, Object>>();
                Dictionary<String, Object> comentario = null;

                foreach (EsComentarioEntrada temp in comentarios)
                {
                    comentario = new Dictionary<String, Object>();
                    comentario.Add("id", temp.IdComentario);
                    comentario.Add("comentario", temp.Comentario);
                    comentario.Add("fecha", temp.Fecha);
                    comentario.Add("modificado", temp.Modificado );
                    comentario.Add("fechaModificado", temp.FechaModificado);
                    comentario.Add("idUsuario", temp.IdUsuario);
                    comentario.Add("nombreUsuario", temp.NombreUsuario);

                    datosComentarios.Add(comentario);
                }

                return datosComentarios;
            }
            catch (Exception)
            {
                throw;
            }

        }




        public static Boolean modificarEntrada(int pIdEntrada, String ptitulo, String pcomentario)
        {
            try
            {
                EntradaPersistente persistenteEntrada = new EntradaPersistente();
                Cl_Entrada entrada = new Cl_Entrada(ptitulo, pcomentario);

                persistenteEntrada.modificarEntrada(entrada, pIdEntrada);
                return true;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public static List<Dictionary<String, Object>> listarEntradasBlogPorFecha(int pidBlog, DateTime pFechaInicio, DateTime pFechaFin)
        {
            try
            {
                EntradaPersistente persistenteEntrada = new EntradaPersistente();

                List<EsEntrada> listaEntradas = persistenteEntrada.listarEntradasBlogPorFecha(pidBlog, pFechaInicio, pFechaFin);
                List<Dictionary<String, Object>> datosEntradas = new List<Dictionary<string, Object>>();
                Dictionary<String, Object> entrada = null;

                foreach (EsEntrada temp in listaEntradas)
                {
                    entrada = new Dictionary<String, Object>();
                    entrada.Add("id", temp.IdEntrada);
                    entrada.Add("titulo", temp.Titulo);
                    entrada.Add("comentario", temp.Comentario);
                    entrada.Add("fecha", temp.Fecha);
                    entrada.Add("modificado", temp.Modificado + "");
                    entrada.Add("fechaModificado", temp.FechaModificado);
                    entrada.Add("idUsuario", temp.IdUsuario);
                    entrada.Add("nombreUsuario", temp.NombreUsuario);
                    entrada.Add("nota", temp.Nota);

                    datosEntradas.Add(entrada);
                }

                return datosEntradas;
            }
            catch (Exception)
            {
                throw;
            }

        }

        public static Boolean asignarCalificacionEntrada(int pIdEntrada, int pNota)
        {
            try
            {
                ComentarioEntradaPersistente persistente = new ComentarioEntradaPersistente();
                persistente.asignarCalificacionEntrada(Session.Id, pIdEntrada, pNota);
                return true;
            }
            catch (Exception ex)
            {

                throw ex;
            }


        }



        public static void eliminarComentarioEntradaBlog(int pidEntrada)
        {
            try
            {
                EntradaPersistente _EntradaPersist = new EntradaPersistente();
                _EntradaPersist.eliminarComentarioEntrada(pidEntrada, Session.Id);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }



        public static bool eliminarEntradaBlog(int pidEntrada)
        {
            try
            {
                EntradaPersistente _BlogPersist = new EntradaPersistente();
                _BlogPersist.eliminarEntradaBlog(pidEntrada, Session.Id);
                return true;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

      

        /// <summary>
        /// Método de la clase encargada de Asignar Calificacion Entrada Blog. 
        /// </summary>
        /// <param name="pidEntrada">idEntrada, tipo int</param>
        /// <remarks></remarks>
        public static String asignarCalificacionEntradaBlog(int pidEntrada, double pnota, int pusuario)
        {
            try
            {
                EntradaPersistente persiste = new EntradaPersistente();

                persiste.asignarCalificacionEntradaBlog(pidEntrada, pnota, pusuario);

                return "¡La Calificación ha sido Asignada!";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

        
    }
}
